﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using ECOSYSTEM_Dominio;

namespace ECOSYSTEM_DAL
{
    public class AlmacenDAL
    {
        SqlConnection cnn;  
        public Boolean guardarProductoAlmacen(Almacen elAlmacen)
        {
            try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();
                SqlCommand cmd = new SqlCommand("RegistrarProductoAlmacen", cnn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@StockActual", SqlDbType.Int);
                cmd.Parameters.Add("@PrecioVenta", SqlDbType.Float);
                cmd.Parameters.Add("@ProductoID", SqlDbType.Int);               

                cmd.Parameters["@StockActual"].Value = elAlmacen.StockActual;
                cmd.Parameters["@PrecioVenta"].Value = elAlmacen.PrecioVenta;
                cmd.Parameters["@ProductoID"].Value = elAlmacen.ElProducto;
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex) { throw new Exception(ex.Message); }
            catch (Exception e) { throw new Exception(e.Message); }
            finally
            {
                if (cnn.State == ConnectionState.Open)
                {
                    cnn.Close();
                }
            }
            return true;
        }
        public Boolean guardarProductoHistorialAlmacen(Almacen elAlmacen)
        {
            try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();
                SqlCommand cmd = new SqlCommand("RegistrarProductoHistorialAlmacen", cnn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@FecReg", SqlDbType.NVarChar, 12);
                cmd.Parameters.Add("@CanProdIngresa", SqlDbType.Int);
                cmd.Parameters.Add("@PrecCompraProd", SqlDbType.Money);
                cmd.Parameters.Add("@UtilidadPorcen", SqlDbType.Float);
                cmd.Parameters.Add("@ProductoID", SqlDbType.Int);
                cmd.Parameters.Add("@RegCompraID", SqlDbType.Int);
                cmd.Parameters["@FecReg"].Value = elAlmacen.FecReg;
                cmd.Parameters["@CanProdIngresa"].Value = elAlmacen.CantidadProdIngresa;
                cmd.Parameters["@PrecCompraProd"].Value = elAlmacen.PrecioCompraProd;
                cmd.Parameters["@UtilidadPorcen"].Value = elAlmacen.Utilidad;
                cmd.Parameters["@ProductoID"].Value = elAlmacen.ElProducto;
                cmd.Parameters["@RegCompraID"].Value = elAlmacen.ElRegCompra;
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex) { throw new Exception(ex.Message); }
            catch (Exception e) { throw new Exception(e.Message); }
            finally
            {
                if (cnn.State == ConnectionState.Open)
                {
                    cnn.Close();
                }
            }
            return true;
        }
        public Boolean ActualizarProductoHistorialAlmacen(Almacen elAlmacen, Int32 CodigoHistorial)
        {
            try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();
                SqlCommand cmd = new SqlCommand("ActualizarProductoHistorialAlmacen", cnn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@HisAlmacenID", SqlDbType.Int, 6);
                cmd.Parameters.Add("@FecReg", SqlDbType.NVarChar, 12);
                cmd.Parameters.Add("@CanProdIngresa", SqlDbType.Int);
                cmd.Parameters.Add("@PrecCompraProd", SqlDbType.Money);
                cmd.Parameters.Add("@UtilidadPorcen", SqlDbType.Float);
                cmd.Parameters.Add("@ProductoID", SqlDbType.Int);
                cmd.Parameters.Add("@RegCompraID", SqlDbType.Int);

                cmd.Parameters["@HisAlmacenID"].Value = CodigoHistorial;
                cmd.Parameters["@FecReg"].Value = elAlmacen.FecReg;
                cmd.Parameters["@CanProdIngresa"].Value = elAlmacen.CantidadProdIngresa;
                cmd.Parameters["@PrecCompraProd"].Value = elAlmacen.PrecioCompraProd;
                cmd.Parameters["@UtilidadPorcen"].Value = elAlmacen.Utilidad;
                cmd.Parameters["@ProductoID"].Value = elAlmacen.ElProducto;
                cmd.Parameters["@RegCompraID"].Value = elAlmacen.ElRegCompra;
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex) { throw new Exception(ex.Message); }
            catch (Exception e) { throw new Exception(e.Message); }
            finally
            {
                if (cnn.State == ConnectionState.Open)
                {
                    cnn.Close();
                }
            }
            return true;
        }
        public Boolean QuitarProductoCompra(Int32 CodigoHisAlma)
        {
            try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();
                SqlCommand cmd = new SqlCommand("EliminarProductoCompra", cnn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@HisAlmacenID", SqlDbType.Int, 6);
                cmd.Parameters["@HisAlmacenID"].Value = CodigoHisAlma;
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex) { throw new Exception(ex.Message); }
            catch (Exception e) { throw new Exception(e.Message); }
            finally
            {
                if (cnn.State == ConnectionState.Open)
                {
                    cnn.Close();
                }
            }
            return true;
        }
        public List<DetalleComprobante> ObtenerProductos()
        {
            List<DetalleComprobante> lista;
            try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();
                SqlCommand cmd = new SqlCommand("ObtenerProductos", cnn);
                cmd.CommandType = CommandType.StoredProcedure;
                lista = new List<DetalleComprobante>();
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    DetalleComprobante elDetaCompro = new DetalleComprobante();
                    elDetaCompro.Producto = dr["Producto"].ToString();
                    elDetaCompro.Cantidad = Convert.ToInt32(dr["StockActual"]);
                    elDetaCompro.Precioventa = Convert.ToDouble(dr["PrecioVenta"]);                               
                    elDetaCompro.CodProd = Convert.ToInt32(dr["ProductoID"]);
                    lista.Add(elDetaCompro);
                }
                return lista;
            }
            catch (SqlException ex) { throw new Exception(ex.Message); }
            catch (Exception e) { throw new Exception(e.Message); }
            finally
            {
                if (cnn.State == ConnectionState.Open)
                {
                    cnn.Close();
                }
            }
        }
        public DataTable ObtenerAllProductos()
        {
            DataTable lista = null;
            try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();
                SqlDataAdapter da = new SqlDataAdapter("ObtenerProductosAll", cnn);
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                lista = new DataTable();
                da.Fill(lista);
            }
            catch (SqlException ex) { throw new Exception(ex.Message); }
            catch (Exception e) { throw new Exception(e.Message); }
            finally
            {
                if (cnn.State == ConnectionState.Open)
                {
                    cnn.Close();
                }
            }
            return lista;
        }
    }
}